// 实现 请求错误时重新发送接口
import { isJsonStr } from "./ParamsUtil.js"

export const retryDelayDefault = 2000

export function loopAgainRequest(response, axios, ) {
  let config = response.config
  const backoff = new Promise(resolve => {
    if (config.__loopTimeoutHandler) {
      clearTimeout(config.__loopTimeoutHandler)
    }
    config.__loopTimeoutHandler = setTimeout(() => {
      resolve()
    }, 2000)
  })
  // 重新发起axios请求
  return backoff.then(() => {
    return axios(config)
  })
}

//重新发送请求的方法
export function errorAgainRequest(err, axios, globalRetry, globalRetryDelay) {
  let config = err.config
  // config.retry 具体接口配置的重发次数
  if (!config) {
    return Promise.reject(err)
  }
  let singleRetry = config.retry
  let singleRetryDelay = config.retryDelay
  let retry = singleRetry === undefined ? globalRetry : singleRetry
  let retryDelay = singleRetryDelay || globalRetryDelay
  //说明
  if (retry === 0) return Promise.reject(err)

  // 设置用于记录重试计数的变量 默认为0
  config.__retryCount = config.__retryCount || 0
  // 判断是否超过了重试次数
  if (config.__retryCount >= retry) {
    return Promise.reject(err)
  }
  // 重试次数
  config.__retryCount += 1
  // 延时处理
  const backoff = new Promise(resolve => {
    if (config.__retryTimeoutHandler) {
      clearTimeout(config.__retryTimeoutHandler)
    }
    config.__retryTimeoutHandler = setTimeout(() => {
      resolve()
    }, retryDelay)
  })
  // 重新发起axios请求
  return backoff.then(() => {
    // 判断是否是JSON字符串
    if (config.data && isJsonStr(config.data)) {
      config.data = JSON.parse(config.data)
    }
    return axios(config)
  })
}
